/* vim: set ts=2 et sw=2 cindent fo=qroca: */
package com.globant.katari.sample.wicket.view;
import static org.easymock.EasyMock.anyInt;
import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.expectLastCall;
import static org.easymock.EasyMock.createMock;
import static org.easymock.EasyMock.createNiceMock;
import static org.easymock.EasyMock.replay;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import org.apache.wicket.MarkupContainer;
import org.apache.wicket.PageParameters;
import org.apache.wicket.markup.IMarkupResourceStreamProvider;
import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.spring.test.ApplicationContextMock;
import org.apache.wicket.util.resource.IResourceStream;
import org.apache.wicket.util.resource.StringResourceStream;
import org.junit.Before;
import org.junit.Test;
import com.globant.katari.hibernate.coreuser.domain.Role;
import com.globant.katari.user.application.DeleteUserCommand;
import com.globant.katari.user.application.Password;
import com.globant.katari.user.application.Profile;
import com.globant.katari.user.application.SaveUserCommand;
import com.globant.katari.user.application.UserFilterCommand;
import com.globant.katari.user.domain.User;
import com.globant.katari.user.domain.filter.Paging;
import com.globant.katari.tools.KatariWicketTester;
public class UserPageTest {
private DeleteUserCommand deleteUser;
private ApplicationContextMock applicationContext;
@Before
public void setUp() {
List<User> firstPage = new LinkedList<User>();
List<Role> theRoles = new ArrayList<Role>();
theRoles.add(new Role("test"));
theRoles.add(new Role("test2"));
UserFilterCommand emptyFilter = createNiceMock(UserFilterCommand.class);
expect(emptyFilter.getPaging()).andReturn(new Paging());
expectLastCall().anyTimes();
expect(emptyFilter.execute()).andReturn(firstPage);
expectLastCall().anyTimes();
replay(emptyFilter);
deleteUser = createMock(DeleteUserCommand.class);
deleteUser.setUserId(0);
expect(deleteUser.execute()).andReturn(null);
replay(deleteUser);
Profile profile = createMock(Profile.class);
expect(profile.getName()).andReturn("name");
expectLastCall().anyTimes();
expect(profile.getEmail()).andReturn("email");
expectLastCall().anyTimes();
expect(profile.getRoles()).andReturn(new ArrayList<Role>());
expectLastCall().anyTimes();
replay(profile);
Password password = createNiceMock(Password.class);
expect(password.getNewPassword()).andReturn("pass");
expectLastCall().anyTimes();
expect(password.getConfirmedPassword()).andReturn("pass");
expectLastCall().anyTimes();
replay(password);
SaveUserCommand saveNewUser = createMock(SaveUserCommand.class);
saveNewUser.setUserId(anyInt());
expectLastCall().anyTimes();
saveNewUser.init();
expectLastCall().anyTimes();
expect(saveNewUser.getProfile()).andReturn(profile);
expectLastCall().anyTimes();
expect(saveNewUser.getPassword()).andReturn(password);
expectLastCall().anyTimes();
expect(saveNewUser.execute()).andReturn(null);
expect(saveNewUser.getRoles()).andReturn(theRoles).anyTimes();
replay(saveNewUser);
applicationContext = new ApplicationContextMock();
applicationContext.putBean("userFilterCommand", emptyFilter);
applicationContext.putBean("deleteUserCommand", deleteUser);
applicationContext.putBean("saveUserCommand", saveNewUser);
}
@Test
public void testNewUser() {
KatariWicketTester tester;
tester = new KatariWicketTester(applicationContext);
tester.startPage(new UserPage());
tester.assertLabel("head-title-label", "New user");
tester.assertModelValue("userForm:profile.name", "name");
tester.assertModelValue("userForm:profile.email", "email");
tester.assertModelValue("userForm:passwords:password.newPassword", "pass");
tester.assertModelValue("userForm:passwords:password.confirmedPassword",
"pass");
}
@Test
public void testSaveUser() {
KatariWicketTester tester;
tester = new KatariWicketTester(applicationContext);
tester.startPage(new UserPage(new PageParameters("id=1")));
tester.assertLabel("head-title-label", "Edit user");
tester.newFormTester("userForm").submit();
/* Submiting the form with:
*
* tester.submitForm("userForm");
*
* does not work, looks like the form is not initialized correctly from the
* data provided by the command.
*/
// FormTester form = tester.newFormTester("userForm"); form.submit();
tester.assertRenderedPage(UserListPage.class);
}
/*
@Test
public void testUserDelete() {
// deletes a user. Does nothing in the page, but executes the delete
// command.
tester.clickLink("users:1:delete");
tester.assertRenderedPage(UserListPage.class);
verify(deleteUser);
}
@Test
public void testUserEdit() {
tester.clickLink("users:1:edit");
tester.assertRenderedPage(UserPage.class);
}
*/
/* Page that contains a single link to a user page. Used for testing
* UserPage.Link.
*/
public static class PageWithLink extends WebPage implements
IMarkupResourceStreamProvider {
public IResourceStream getMarkupResourceStream(
final MarkupContainer container, final Class<?> containerClass) {
return new StringResourceStream(
"<html><span wicket:id='edit'></span></html>");
}
public PageWithLink(final User user) {
if (user == null) {
add(new UserPage.Link("edit"));
} else {
add(new UserPage.Link("edit", user));
}
}
}
@Test
public void testLink_noUser() {
KatariWicketTester tester = new KatariWicketTester(applicationContext);
tester.startPage(new PageWithLink(null));
tester.clickLink("edit");
tester.assertRenderedPage(UserPage.class);
}
@Test
public void testLink_user() {
KatariWicketTester tester = new KatariWicketTester(applicationContext);
tester.startPage(new PageWithLink(new User("name", "password")));
tester.clickLink("edit");
tester.assertRenderedPage(UserPage.class);
tester.assertModelValue("userForm:profile.name", "name");
}
}